Procesando datos con {tidyverse}

Principales herramientas (funciones) para el tratamiento de datos

2024-02-21

Bienvenidos y bienvenidas a Estación R

💬 Slack

🔗 Web

🐘 Mastodon

𝕏 X

✉️ Correo

¿Qué vimos?


✅ Conceptos básicos de R (valores, vectores, data.framtes, funciones, objetos)


✅ Cómo armar y organizar un proyecto de trabajo


✅ Qué son los paquetes (o librerías)

Hoja de Ruta

📌 ¿Qué es la Ciencia de Datos?


📦 Paquete {dplyr}

🔧 `select()` 🔧 `filter()` 

🔧 `mutate()` 🔧 `rename()` 

🔧 `arrange()` 

🔧 `group_by()` 🔧 `summarise()`  

🔧 `joins` 

📌 La pipa (|> o %>%)


📦 Paquete {tidyr}

🔧 `pivot_longer()` 🔧 `pivot_wider()`  

Configuración para esta clase


  • Armar un proyeto de trabajo nuevo

  • Crear una carpeta en el llamada datos

  • Descargar la base del Padrón Único Nacional de Alojamientos (Argentina) y ubicarla en la carpeta datos

  • Crear un script de trabajo

¿Qué es la Ciencia de Datos?

¿Qué es la Ciencia de Datos?

r project console

{tidyverse}

¿Qué es {tidyverse}?

  • Una colección de paquetes.

  • Comparten una filosofía acerca de los datos y la programación en R (“tidy” -ordenado-).

  • Tienen una coherencia para ser utilizados en conjunto.

  • Orientado a ser leído y escrito por y para seres humanos.

  • Una comunidad, basada en los principios del código abierto y trabajo colaborativo.

¿Qué es {tidyverse}?

{tidyverse}


  • Instalación:
install.packages("tidyverse")

{tidyverse}


  • Cargo el paquete:
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.4.4     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.0
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

{tidyverse}

  • Nos evita tener que instalar uno por uno a cada paquete:
install.packages("dplyr")
install.packages("tidyr")
install.packages("ggplot2")


  • Como también tener que convocarlos de a uno:
library(dplyr)
library(tidyr)
library(ggplot2)

La pipa

Un operador llamado pipa




base_de_datos |> 
  funcion1 |> 
  funcion2 |>  
  funcion3

Un operador llamado pipa


  • Pipa de R base: |>


  • Pipa de {magritr}: %>%

Ejemplo:



datos <- data.frame(nombre = c("Pirulanzo", "Rodogovia", "Rodogovia", "Rodogovia"),
                    edad = c(23, 12, 87, 32))

datos
     nombre edad
1 Pirulanzo   23
2 Rodogovia   12
3 Rodogovia   87
4 Rodogovia   32

Ejemplo:

  • Quiero calcular qué proporción de personas se llaman Rodogovia


  • Antes (sin el pipe):
round(prop.table(table(datos$nombre)), digits = 1)

Pirulanzo Rodogovia 
      0.2       0.8 

Ejemplo:


  • Después (con el pipe):
datos$nombre |> 
  table() |> 
  prop.table() |> 
  round(digits = 1)

Pirulanzo Rodogovia 
      0.2       0.8 

Funciones del paquete dplyr:


Función Acción
select() selecciona o descarta variables
filter() selecciona filas
mutate() crea / edita variables
rename() renombra variables
group_by() segmenta en funcion de una variable
summarize() genera una tabla de resúmen

select()


Elige o descarta columnas de una base de datos

select()


  • La función tiene la siguiente estructura:
base_de_datos |> 
  select(id, nombre) #<<

Caso práctico

# Cargo paquete
library(readr)

# Importo datos
df_puna <- read_csv("datos/puna_base_agregada.csv")


# Exploro la base
colnames(df_puna)
 [1] "indice_tiempo"           "region"                 
 [3] "ruta_natural"            "provincia_codigo"       
 [5] "provincia_nombre"        "departamento_partido"   
 [7] "localidad"               "clasificacion_minturdep"
 [9] "tipo"                    "establecimientos"       
[11] "unidades"                "habitaciones"           
[13] "plazas"                 

Caso práctico


  • Pedido: La coordinadora me ha solicitado conocer la cantidad de plazas que hay por localidad y, si es posible, saber de qué tipo son los alojamientos


  • Variables de trabajo:

    • localidad
    • plazas
    • tipo

Caso práctico


  • Selecciono las 3 columnas de interés
library(tidyverse)

df_puna |> 
  select(localidad, tipo, plazas)

Caso práctico


  • Selecciono las 3 columnas de interés
library(tidyverse)

df_puna_sel <- df_puna |> 
  select(localidad, tipo, plazas)


  • Chequeo las columnas del nuevo objeto
colnames(df_puna_sel)
[1] "localidad" "tipo"      "plazas"   

Otras formas de seleccionar…

select() - por posición


  1. Chequeo la posición:
colnames(df_puna)
 [1] "indice_tiempo"           "region"                 
 [3] "ruta_natural"            "provincia_codigo"       
 [5] "provincia_nombre"        "departamento_partido"   
 [7] "localidad"               "clasificacion_minturdep"
 [9] "tipo"                    "establecimientos"       
[11] "unidades"                "habitaciones"           
[13] "plazas"                 

select() - por posición


  1. Selecciono
df_puna_sel_posicion <- df_puna |> 
  select(7, 9, 13)

select() - por posición


  1. Chequeo
colnames(df_puna_sel_posicion)
[1] "localidad" "tipo"      "plazas"   

select() - por posición (columnas consecutivas)


df_puna_sel_posicion2 <- df_puna |> 
  select(1:3)

select() - por posición (columnas consecutivas)


df_puna_sel_posicion2 <- df_puna |> 
  select(1:3)


colnames(df_puna_sel_posicion2)
[1] "indice_tiempo" "region"        "ruta_natural" 

select() - por nombre (consecutiva)


df_puna_sel_posicion3 <- df_puna |> 
  select(establecimientos:plazas)

select() - por nombre (consecutiva)


df_puna_sel_posicion3 <- df_puna |> 
  select(establecimientos:plazas)


colnames(df_puna_sel_posicion3)
[1] "establecimientos" "unidades"         "habitaciones"     "plazas"          

select() - Por patrones de texto


Trío:

  • starts_with() –> empieza con…

  • ends_with() –> termina con…

  • contains() –> contiene…

select() + starts_with()


df_puna_sel_patron1 <- df_puna |> 
  select(starts_with("provincia"))

select() + starts_with()


df_puna_sel_patron1 <- df_puna |> 
  select(starts_with("provincia"))


colnames(df_puna_sel_patron1)
[1] "provincia_codigo" "provincia_nombre"

select() + ends_with()


df_puna_sel_patron2 <- df_puna |> 
  select(ends_with("o"))

select() + starts_with()


df_puna_sel_patron2 <- df_puna |> 
  select(ends_with("o"))


colnames(df_puna_sel_patron2)
[1] "indice_tiempo"        "provincia_codigo"     "departamento_partido"
[4] "tipo"                

select() + contains()


df_puna_sel_patron3 <- df_puna |> 
  select(contains("_"))

select() + contains()


df_puna_sel_patron3 <- df_puna |> 
  select(contains("_"))


colnames(df_puna_sel_patron3)
[1] "indice_tiempo"           "ruta_natural"           
[3] "provincia_codigo"        "provincia_nombre"       
[5] "departamento_partido"    "clasificacion_minturdep"

LA COMBINACIÓN FINAL

select()


df_puna_select_tuto <- df_puna |> 
  select(localidad, 2, starts_with("provincia"), 9:11)

select()


df_puna_select_tuto <- df_puna |> 
  select(localidad, 2, starts_with("provincia"), 9:11)


colnames(df_puna_select_tuto)
[1] "localidad"        "region"           "provincia_codigo" "provincia_nombre"
[5] "tipo"             "establecimientos" "unidades"        

Ejercitación grupal

Ejercitación

  • Crear un objeto en donde importamos la base de datos de Alojamientos.

  • Seleccionar 3 variables de la base según el nombre de las mismas y guardar en otro objeto.

  • Seleccionar 3 variables de la base según la posición de las mismas y guardar en otro objeto.

  • Seleccionar todas las variables que empiecen con un patrón de texto (a elegir).

filter()


Define los casos (filas) en base a una condición

filter()


  • La función tiene la siguiente estructura:
base_de_datos |> 
  filter(condicion) 

filter()


  • La función tiene la siguiente estructura:
base_de_datos |> 
  filter(Edad > 65) 

Caso práctico


  • La directora de tesis me pidió que estudie los alojamientos de tipo Camping.


  • Universo de análisis / Población de estudio:

    • Alojamientos tipo Camping

Caso práctico


  • Chequeo con qué tipos de alojamiento cuento en la base:

Caso práctico


  • Chequeo con qué tipos de alojamiento cuento en la base:
unique(df_puna$clasificacion_minturdep)
 [1] "Albergue municipal / complejo deportivo"
 [2] "Caba\xf1as / bungalows"                 
 [3] "Conjunto de unidades turisticas"        
 [4] "Establecimiento rural"                  
 [5] "Hosteria"                               
 [6] "Hotel 1 estrella"                       
 [7] "Hotel 2 estrellas"                      
 [8] "Hotel boutique"                         
 [9] "Hotel sin categorizar"                  
[10] "Residencial"                            
[11] "Camping"                                
[12] "Hotel 3 estrellas"                      
[13] "Sin clasificar"                         
[14] "Motel"                                  
[15] "Hospedaje"                              
[16] "Posada"                                 
[17] "Apart hotel"                            
[18] "Albergue / b&b / hostel"                
[19] "Hotel 4 estrellas"                      
[20] "Hotel 5 estrellas"                      
[21] "Dormis"                                 
[22] "Residencia universitaria"               
[23] "Hotel sindical / mutual"                
[24] "Complejo turistico"                     
[25] "Refugio"                                
[26] "Pension"                                
[27] "Lodge de pesca / caza/ en bodegas"      

Caso práctico


  • Aplico filtro
library(tidyverse)

df_filtrada <- df_puna |> 
  filter(clasificacion_minturdep == "Camping")

Caso práctico


  • Chequeo filtro
unique(df_filtrada$clasificacion_minturdep)
[1] "Camping"

filter()

Condición Acción
== igual
%in% incluye
!= distinto
> mayor que
< menor que
>= mayor o igual que
<= menor o igual que
Operador Descripción
& y - Cuando se cumplen ambas condiciones
| o - Cuando se cumple una u otra condición

Caso práctico


  • La encargada de la oficina de turismo de Buenos Aires quiere que le arme una base sólo con alojamientos de tipo Camping y Hoteles 3 estrellas.

Caso práctico


  • Chequeo las categorías de la variable clasificacion_minturdep
unique(df_puna$clasificacion_minturdep)
 [1] "Albergue municipal / complejo deportivo"
 [2] "Caba\xf1as / bungalows"                 
 [3] "Conjunto de unidades turisticas"        
 [4] "Establecimiento rural"                  
 [5] "Hosteria"                               
 [6] "Hotel 1 estrella"                       
 [7] "Hotel 2 estrellas"                      
 [8] "Hotel boutique"                         
 [9] "Hotel sin categorizar"                  
[10] "Residencial"                            
[11] "Camping"                                
[12] "Hotel 3 estrellas"                      
[13] "Sin clasificar"                         
[14] "Motel"                                  
[15] "Hospedaje"                              
[16] "Posada"                                 
[17] "Apart hotel"                            
[18] "Albergue / b&b / hostel"                
[19] "Hotel 4 estrellas"                      
[20] "Hotel 5 estrellas"                      
[21] "Dormis"                                 
[22] "Residencia universitaria"               
[23] "Hotel sindical / mutual"                
[24] "Complejo turistico"                     
[25] "Refugio"                                
[26] "Pension"                                
[27] "Lodge de pesca / caza/ en bodegas"      

Caso práctico


  • Filtro (opción 1):
df_camping_y_hoteles3estrellas <- df_puna |> 
  filter(clasificacion_minturdep == "Camping" | clasificacion_minturdep == "Hotel 3 estrellas")

Caso práctico


  • Chequeo filtro
unique(df_camping_y_hoteles3estrellas$clasificacion_minturdep)
[1] "Camping"           "Hotel 3 estrellas"

Caso práctico


  • Filtro (opción 2, operador: %in%):
df_camping_y_hoteles3estrellas <- df_puna |> 
  filter(clasificacion_minturdep %in% c("Camping", "Hotel 3 estrellas"))

Caso práctico


  • Chequeo filtro
unique(df_camping_y_hoteles3estrellas$clasificacion_minturdep)
[1] "Camping"           "Hotel 3 estrellas"

select() + filter()


df_puna |> 
  select(localidad, 
         clasificacion_minturdep)
# A tibble: 14,717 × 2
   localidad clasificacion_minturdep                  
   <chr>     <chr>                                    
 1 Baradero  "Albergue municipal / complejo deportivo"
 2 Baradero  "Caba\xf1as / bungalows"                 
 3 Baradero  "Conjunto de unidades turisticas"        
 4 Baradero  "Establecimiento rural"                  
 5 Baradero  "Hosteria"                               
 6 Baradero  "Hotel 1 estrella"                       
 7 Baradero  "Hotel 2 estrellas"                      
 8 Baradero  "Hotel boutique"                         
 9 Baradero  "Hotel sin categorizar"                  
10 Baradero  "Residencial"                            
# ℹ 14,707 more rows

select() + filter()


df_puna |> 
  select(localidad, 
         clasificacion_minturdep) |> 
  filter(clasificacion_minturdep %in% c("Camping", "Hotel 3 estrellas"))
# A tibble: 1,438 × 2
   localidad                  clasificacion_minturdep
   <chr>                      <chr>                  
 1 Belen de Escobar           Camping                
 2 Belen de Escobar           Hotel 3 estrellas      
 3 Fatima                     Hotel 3 estrellas      
 4 Ramallo                    Hotel 3 estrellas      
 5 Villa Ramallo              Hotel 3 estrellas      
 6 San Nicolas de Los Arroyos Hotel 3 estrellas      
 7 San Pedro                  Camping                
 8 San Pedro                  Hotel 3 estrellas      
 9 Zarate                     Hotel 3 estrellas      
10 9 de Julio                 Hotel 3 estrellas      
# ℹ 1,428 more rows

Ejercitación grupal

Ejercitación

  • Crear un objeto que contenga la base de PUNA sólo con las variables localidad, ruta_natural y plazas

  • En ese mismo objeto, quedarse sólo con las filas de la ruta natural Delta.

  • Calcular cuántas plazas hay en total para la ruta natural Delta (tip: la función sum() puede ser de ayuda)

mutate()


Crea / edita variables (columnas)

mutate()


  • La función tiene la siguiente estructura:


base_de_datos %>% 
   mutate(var_nueva = var_1 + var_2)

mutate() - Caso práctico


  • Llega a la oficina una persona interesada en saber cuál es el valor total disponible para dormir en los establecimientos. Quiere, entonces, conocer el resultado de la suma entre habitaciones y plazas.
  • Para ello, podemos crear una variable que contenga este resultado:

mutate() - Caso práctico

df_lugar_tot <- df_puna |> 
  select(localidad, habitaciones, plazas) |> 
  mutate(lugar_disponible = habitaciones + plazas)
# A tibble: 14,717 × 4
   localidad habitaciones plazas lugar_disponible
   <chr>            <dbl>  <dbl>            <dbl>
 1 Baradero             6     30               36
 2 Baradero             0    277              277
 3 Baradero             0     50               50
 4 Baradero            57    131              188
 5 Baradero            68    164              232
 6 Baradero            15     34               49
 7 Baradero            49    135              184
 8 Baradero            27     78              105
 9 Baradero            28     60               88
10 Baradero             5     15               20
# ℹ 14,707 more rows